avoid small conveniences which mix concerns; construction is a concern, it should be the single concern of a single class
if you don’t know when to build an object, but will need to build one eventually, use a Factory
Inversion of Control; delegate responsibilities to other, dedicated objects
Injecting dependencies via the controller guarantees the object shares no part of dependency management
Systems can scale cleanly only if their concerns are well-separated.
common behaviors across multiple objects
facilitate testing however possible: Reduce dependencies on concrete implementations wherever possible; rely on plain old objects or similar as much as possible in order to facilitate testing